﻿using UnityEngine;
using System.Collections;



/// <summary>
/// 추적자 인공지능
/// </summary>
public class ChaserController : MonsterController
{
	// Properties

	[SerializeField]
	float				m_agroArea	= 20f;			// 어그로 범위
	[SerializeField]
	bool				m_randomJump	= false;	// 랜덤 점프
	[SerializeField]
	float				m_randomJumpTimeMin	= 0.5f;	// 랜덤 점프 최대 체크 시간
	[SerializeField]
	float				m_randomJumpTimeMax	= 5f;	// 랜덤 점프 최대 체크 시간

	[SerializeField]
	bool				m_smartMode	= false;			// 지면인식 모드 사용할지 여부


	// Members

	/// <summary>
	/// 어그로를 끌렸는지
	/// </summary>
	/// <value><c>true</c> if is awaken; otherwise, <c>false</c>.</value>
	public virtual bool isAwaken
	{
		get;
		protected set;
	}

	protected override void OnInitialize()
	{
		base.OnInitialize();

		useGroundDetector	= m_smartMode;

		if (m_randomJump)
		{
			StartCoroutine(RandomJump());
		}
	}

	protected override void OnUpdate ()
	{
		base.OnUpdate ();

		PlayerCharacter	 player	= GameScene.playerCharacter as PlayerCharacter;
		if(player == null)																// 플레이어가 이미 죽거나 없어진 경우엔 중지
		{
			moving	= false;
			return;
		}

		float distX				= player.transform.position.x - transform.position.x;	// 플레이어와의 거리

		if(!isAwaken)								// * 인식 안했을 때
		{
			if(!character.isHidden && Mathf.Abs (distX) < m_agroArea)	// 숨김 상태가 아니고 일정 거리 안에 들어옴 - 인식
			{
				//Debug.Log(gameObject.name + "awaken!");
				isAwaken	= true;
			}
		}

		if(isAwaken)								// * 인식했을 때
		{
			character.currentDirection = distX < 0? BaseCharacter.Direction.Left : BaseCharacter.Direction.Right;	// 방향 설정
			moving	= true;

			if (groundAhead || dropAhead)				// 낭떠러지나 벽 앞에서는 점프
				character.Jump();

			if(groundAhead)								// * 벽에 끼어서 점프하지 못하는 현상 해결
				moving	= false;	
		}
	}

	IEnumerator RandomJump()
	{
		while (true)
		{
			yield return new WaitForSeconds(Random.Range(m_randomJumpTimeMin, m_randomJumpTimeMax));	// 랜덤한 시간마다 점프하게

			character.Jump();
		}
	}
}
